﻿using Autofac.Features.OwnedInstances;
using Cache;
using DtoFw;
using DtoFw.Base;
using DtoFw.Query;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Org.BouncyCastle.Utilities;
using Renci.SshNet.Messages;
using Service;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace SceneEvidenceAPI.Controllers
{
    /// <summary>
    /// 物证保管中心仓库的3维效果
    /// </summary>
    [Route("api/v1/threedimensional")]
    public class ThreedimensionalController : BaseController
    {
        private readonly RoomService _roomService;
        private readonly MainOrganService _organService;
        public ThreedimensionalController(RoomService roomService, MainOrganService organService)
        {
            this._roomService = roomService;
            this._organService = organService;
        }
        /// <summary>
        /// 4.1.3.1	获取仓库物品数量接口
        /// </summary>
        /// <param name="corpCode">单位编号</param>
        /// <param name="warehouseCode">区域编号</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpGet("warehouse")]
        public string Warehouse(string corpCode, string warehouseCode)
        {
            var corp = this._organService.Get(corpCode);
            if(corp == null)
            {
                return Write(300, "单位编号不存在", null, "corpCode");
            }
            /*
             inCount: 仓库在库物证总数
            outCount: 仓库出库物证总数
             */
            var retList = this._roomService.QueryCountByAreaCode(corp.Id, warehouseCode);
            return Write(200, "", retList);
        }

        /// <summary>
        /// 4.1.3.2	获取设备所属库位详细信息接口
        /// </summary>
        /// <param name="corpCode">单位编号</param>
        /// <param name="deviceCode">设备编号</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpGet("device/cell/detail")]
        public string CellDetail(string corpCode, string deviceCode)
        {
            var corp = this._organService.Get(corpCode);
            if (corp == null)
            {
                return Write(300, "单位编号不存在", null, "corpCode");
            }
            /*
             id	        String	主键id	
             cellCode	Intger	柜子格子名称	如柜体规格为A8+B10（A柜有8个格子，B柜为10个格子），则cellCode的值为总数8或10
             cellName	String	柜子格子编号	如柜体规格为A8+B10（A柜有8个格子，B柜为10个格子），则cellName的值为A或B
             */
            var retLst = this._roomService.QueryCabinetByDeviceCode(corp.Id, deviceCode);
            return Write(0, "", retLst);
        }

        /// <summary>
        /// 4.1.3.3	获取设备物品数量接口
        /// </summary>
        /// <param name="corpCode">单位编号</param>
        /// <param name="deviceCode">设备编号</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpGet("device")]
        public string DeviceCount(string corpCode, string deviceCode)
        {
            var corp = this._organService.Get(corpCode);
            if (corp == null)
            {
                return Write(300, "单位编号不存在", null, "corpCode");
            }
            /*
            inCount: 仓库在库物证总数
           outCount: 仓库出库物证总数
            */
            var retList = this._roomService.QueryCountByDeviceCode(corp.Id, deviceCode);
            return Write(200, "", retList);
        }

        /// <summary>
        /// 4.1.3.4	获取设备所属位置物证数量接口
        /// </summary>
        /// <param name="corpCode">单位编号</param>
        /// <param name="deviceCode">设备编号</param>
        /// <param name="cellName">单位编号(和cellCode配套使用(如：格子A1，A2，B1中的”字母”值)；多个格子用英文”,”分隔；)</param>
        /// <param name="cellCode">设备编号(和cellName配套使用(如：格子A1，A2，B1中的”数字”值)；多个格子用英文”,”分隔；)</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpGet("device/cell")]
        public string DeviceCell(string corpCode, string deviceCode,string cellName,int cellCode)
        {
            var corp = this._organService.Get(corpCode);
            if (corp == null)
            {
                return Write(300, "单位编号不存在", null, "corpCode");
            }
            /*
           inCount: 仓库在库物证总数
          outCount: 仓库出库物证总数
           */
            var retList = this._roomService.QueryCountByDeviceCellCode(corp.Id, deviceCode, cellName, cellCode); 
            return Write(0, "", retList);
        }

        /// <summary>
        /// 4.1.3.5	获取设备所属位置物品列表接口
        /// </summary>
        /// <param name="corpCode">单位编号</param>
        /// <param name="deviceCode">设备编号</param>
        /// <param name="cellName">单位编号(和cellCode配套使用(如：格子A1，A2，B1中的”字母”值)；多个格子用英文”,”分隔；)</param>
        /// <param name="cellCode">设备编号(和cellName配套使用(如：格子A1，A2，B1中的”数字”值)；多个格子用英文”,”分隔；)</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpGet("device/cell/list")]
        public string DeviceCellList(string corpCode, string deviceCode, string cellName, int cellCode)
        {
            var corp = this._organService.Get(corpCode);
            if (corp == null)
            {
                return Write(300, "单位编号不存在", null, "corpCode");
            }
            /*
            id	            String	主键id	
            caseCode	    String	案件编号	
            caseName	    String	案件名称	
            propertyCode	String	物证编号	
            propertyName	String	物证名称	
            quantity	    Intger	数量	
            corpCode	    String	主办单位编号	
            corpNmae	    String	主办单位名称	
            owner	        String	持有人	
            warehouseCode	String	仓库编号	
            warehouseName	String	仓库名称	
            deviceCode	    String	设备编号	
            deviceName	    String	设备名称	
            cellCode	    Intger	柜子格子编号	和cellName配套使用(如：格子A1，A2，B1中的”数字”值)；多个格子用英文”,”分隔；
            cellName	    String	柜子格子名称	和cellCode配套使用(如：格子A1，A2，B1中的”字母”值)；多个格子用英文”,”分隔；
            */
            var retList = this._roomService.QueryListByDeviceCellCode(corp.Id, deviceCode, cellName, cellCode);
            return Write(0, "", retList);
        }

        /// <summary>
        /// 4.1.3.6	获取设备所属位置物品详细明细接口
        /// </summary>
        /// <param name="propertyCode">物证编号</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpGet("device/property/detail")]
        public string DeviceDetail(string propertyCode)
        {
            /*
            id	                String	主键id	
            caseCode	        String	案件编号	
            caseName	        String	案件名称	
            code	            String	物证编号	
            name	            String	物证名称	
            typeName	        String	物证类别	
            sourceName	        String	物证来源	
            registerState	    Intger	登记状态	0:未登记入库；1：已登记入库
            registerTime	    DateTime	登记日期	日期格式（yyyy-MM-dd hh:mm:ss）
            owner	            String	持有人	
            corpCode	        String	主办单位编号	
            corpName	        String	主办单位名称	
            organiserCode	    String	主办人编号	
            organiserName	    String	主办人姓名	
            unit	            String	单位	
            statusName	        String	物证状态	
            colour	            String	颜色	
            specificationModel	String	规格型号	
            warehouseCode	    String	仓库编号	
            warehouseName	    String	仓库名称	
            deviceCode	        String	设备编号	
            deviceName	        String	设备名称	
            cellCode	        Intger	柜子格子编号	和cellName配套使用(如：格子A1，A2，B1中的”数字”值)；多个格子用英文”,”分隔；
            cellName	        String	柜子格子名称	和cellCode配套使用(如：格子A1，A2，B1中的”字母”值)；多个格子用英文”,”分隔；
             */
            var retList = this._roomService.QueryPropertyByCode(propertyCode);
            return Write(0, "", retList);
        }

        /// <summary>
        /// 4.1.3.5	获取设备所属位置物品列表接口
        /// </summary>
        /// <param name="warehouseCode">仓库编号</param>
        /// <param name="corpCode">单位编号</param>
        /// <param name="deviceCode">设备编号</param>
        /// <param name="caseCode">案件编号</param>
        /// <param name="caseName">案件名称</param>
        /// <param name="propertyCode">物证编号</param>
        /// <param name="propertyName">物证名称</param>
        /// <param name="owner">持有人</param>
        /// <returns></returns>
        [AllowAnonymous]
        [HttpGet("property/list")]
        public string PropertyList(string warehouseCode, string corpCode, string deviceCode, string caseCode, string caseName, string propertyCode, string propertyName, string owner)
        {
            /*
            id	            String	主键id	
            caseCode	    String	案件编号	
            caseName	    String	案件名称	
            propertyCode	String	物证编号	
            propertyName	String	物证名称	
            quantity	    Intger	数量	
            corpCode	    String	主办单位编号	
            corpNmae	    String	主办单位名称	
            owner	        String	持有人	
            warehouseCode	String	仓库编号	
            warehouseName	String	仓库名称	
            deviceCode	    String	设备编号	
            deviceName	    String	设备名称	
            cellCode	    Intger	柜子格子编号	和cellName配套使用(如：格子A1，A2，B1中的”数字”值)；多个格子用英文”,”分隔；
            cellName	    String	柜子格子名称	和cellCode配套使用(如：格子A1，A2，B1中的”字母”值)；多个格子用英文”,”分隔；
            */
            var retList = this._roomService.QueryPropertyList(warehouseCode, corpCode, deviceCode, caseCode, caseName, propertyCode, propertyName, owner);
            return Write(0, "", retList);
        }

        string Write(int code,string message,object data,string field=null)
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(new { code, message, field, data });
        } 
    }
}
